`timescale 1ns / 1ps
/*--------------------------------------------------------------------*\
FileName        : cbb_timer_ena.v
Author          ：hpy
Email           ：yuan_hp@qq.com
Date            ：2025年05月14日
Description     ：对系统时钟计数，计数到后产生一个系统时钟脉宽的高电平信号,
计数次数为 i_times+1 次产生一个脉冲

1.例化 
cbb_timer_ena  u_cbb_timer_ena(clk, rst_n ,i_times , o_ena) ;
或者
cbb_timer_ena  #(
    .N(32)
) u_cbb_timer_ena (
    .i_clk  ( ), // 输入时钟
    .i_rst_n( ), // 输入复位信号，低电平复位
    .i_times( ), // 计数值 
    .o_ena  ( )  // 计数时间到
) ;

\*--------------------------------------------------------------------*/
module cbb_timer_ena #(
    parameter N = 32  // 计数器位宽
)(
    input                   i_clk,
    input                   i_rst_n, // 是否复位重装计数值，高电平重装数据，可接复位信号
    input   wire [N-1:0]    i_times, // 多少个周期产生一次使能信号
    output  wire    o_ena
);

reg [N-1:0] clkcnt ;

assign o_ena = ~|clkcnt;

always@(posedge i_clk) begin
    if(~i_rst_n | ~|clkcnt)begin
        clkcnt <= i_times ; // i_divider ;
    end else begin
        clkcnt <= clkcnt - 1 'b1 ;
    end
end


`ifdef  CBB_SIM 
`include "cbb_sim.v"
initial begin 
    forever begin
        @(posedge i_clk )begin 
            `CBB_SIM_LOG(("clkcnt=%0d, o_ena=%0d",clkcnt,o_ena)) ;
        end
    end
end
`endif 

endmodule

